namespace vue0701.Domain.Entities.App;

public class AppUser : EntityBase
{
    public string UserName { get; private set; }
    public string Password { get; private set; }
    public string Salt { get; private set; }
    private readonly List<AppUserRole> _userRoles = new();
    public IReadOnlyCollection<AppUserRole> UserRoles => _userRoles.AsReadOnly();
#pragma warning disable CS8618 // 在退出构造函数时，不可为 null 的字段必须包含非 null 值。请考虑添加 "required" 修饰符或声明为可为 null。
    protected AppUser() { }
#pragma warning restore CS8618 // 在退出构造函数时，不可为 null 的字段必须包含非 null 值。请考虑添加 "required" 修饰符或声明为可为 null。

    public AppUser(string userName,string password, string salt)
    {
        UserName = userName;
         Password = password;
        Salt = salt;
    }

    //  分配角色
    public void AssignRole(AppRole role)
    {
        if (_userRoles.Any(ur => ur.RoleId == role.Id)) return;
        _userRoles.Add(new AppUserRole(this, role));
    }

    // 移除角色
    public void RemoveRole(AppRole role)
    {
        var userRole = _userRoles.FirstOrDefault(ur => ur.RoleId == role.Id);
        if (userRole != null) _userRoles.Remove(userRole);
    }

    // 判断有无权限
    /*
        权限的表达：
        Order.Create
        Order.Delete
        Order.Edit
        Order.Split
        

    */
    public bool HasPermission(string permissionName)
    {
        return _userRoles.Any(ur => ur.Role.HasPermission(permissionName));
    }
    

     public void SetPassword(string password, string salt)
    {
        Password = password;
        Salt = salt;
    }

    public bool VerifyPassword(string password)
    {
        return Password == password;
    }
}